#ifndef __MY_LZC_LOG_H__
#define __MY_LZC_LOG_H__

#include "Logger.hpp"

namespace LzcLog
{
    //  1. 获取指定日志器
    Logger::ptr GetLogger(const std::string& name) {
        return LoggerManager::GetInstance().GetLogger(name);
    }
    Logger::ptr GetRootLogger() {
        return LoggerManager::GetInstance().GetRootLogger();
    }
}

// 宏不受命名空间约束
// 宏在编译之前就被预处理器处理了，而命名空间是C++编译时的概念。
//  2. 使用宏函数对日志器的接口进行代理。
#define LOG_DEBUG(fmt, ...) DEBUG(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...) INFO(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_WARNING(fmt, ...) WARNING(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) ERROR(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_FATAL(fmt, ...) FATAL(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

// 3. 提供宏函数，直接通过默认日志器进行日志的标准输出打印
#define LOGD(fmt, ...) (LzcLog::GetRootLogger())->LOG_DEBUG(fmt, ##__VA_ARGS__)
#define LOGI(fmt, ...) (LzcLog::GetRootLogger())->LOG_INFO(fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...) (LzcLog::GetRootLogger())->LOG_WARNING(fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) (LzcLog::GetRootLogger())->LOG_ERROR(fmt, ##__VA_ARGS__)
#define LOGF(fmt, ...) (LzcLog::GetRootLogger())->LOG_FATAL(fmt, ##__VA_ARGS__)

#endif